home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / utilitys / 104 / drfloppy / drsect.s < prev    next >
Encoding:
Text File  |  1987-10-29  |  32.6 KB  |  978 lines

  1.                TEXT
  2.                INCLUDE '\LIB\GEMDOS.S'
  3.                INCLUDE '\LIB\XBIOS.S'
  4.                INCLUDE '\LIB\BIOS.S'
  5.                INCLUDE '\LIB\ESCCHAR.S'
  6.                XDEF EDIT_SECTOR
  7.                CNOP 0,4
  8. EDIT_SECTOR    BSR      TURN_CURSOR_OFF
  9.                BSR      TURN_CAPS_ON
  10.                MOVE.W   #0,PAGE_OFFSET
  11.                MOVE.W   #0,DRIVE
  12.                MOVE.B   #0,SEARCH_KEY_LEN
  13.                LEA      SECTOR_SCREEN,A0
  14.                BSR      WRITE_STRING
  15.                BSR      PRINT_OFFSET
  16.                BSR      PRINT_DRIVE
  17.                BSR      ZERO_BUFFER
  18.                BSR      BUILD_DATA_SCREEN
  19.                BSR      GET_BOOT_SECTOR
  20.                BSR      MOVE_CURSOR_HOME
  21.                BRA      SCREEN_ROW_COL_SET
  22. EDIT_SECTOR_EXIT
  23.                ADDQ.L   #4,SP
  24.                RTS
  25. SCREEN_ROW_COL_SET
  26.                BSR      CALC_BUFFER_LOCATION
  27.                BSR      CALC_HEX_LOCATION
  28.                BSR      CALC_ASCII_LOCATION
  29.                MOVE.B   HEX_ROW,CURSOR_SET_ROW
  30.                MOVE.B   HEX_COL,CURSOR_SET_COL
  31.                LEA      CURSOR_SET,A0
  32.                BSR      WRITE_STRING
  33.                BSR      TURN_CURSOR_ON
  34.                BSR      KEYBOARD_READ
  35.                BRA      SCREEN_ROW_COL_SET
  36. KEYBOARD_READ  MOVE.W   #$FF,-(SP)
  37.                MOVE.W   #RAWCONIO,-(SP)
  38.                TRAP     #GEMDOS
  39.                ADDQ.L   #4,SP
  40.                TST.L    D0
  41.                BEQ      KEYBOARD_READ_1
  42.                CMP.B    #$5C,SCAN_CODE
  43.                BEQ      KEYBOARD_READ_2
  44.                CMP.B    #$5D,SCAN_CODE
  45.                BEQ      KEYBOARD_READ_2
  46.                BRA      KEYBOARD_READ
  47. KEYBOARD_READ_1
  48.                MOVE.W   #CONIN_WO_ECHO,-(SP)
  49.                TRAP     #GEMDOS
  50.                ADDQ.L   #2,SP
  51.                MOVE.B   D0,CHAR_CODE
  52.                SWAP     D0
  53.                MOVE.B   D0,SCAN_CODE
  54. KEYBOARD_READ_2
  55.                BSR      TURN_CURSOR_OFF
  56.                CMP.B    #0,MSG_ERROR_FLAG
  57.                BEQ      CHECK_SPECIAL_KEY
  58.                MOVE.B   #0,MSG_ERROR_FLAG
  59.                LEA      MSG_STATUS_OK,A0
  60.                BSR      WRITE_STRING
  61.                MOVE.B   HEX_ROW,CURSOR_SET_ROW
  62.                MOVE.B   HEX_COL,CURSOR_SET_COL
  63.                LEA      CURSOR_SET,A0
  64.                BSR      WRITE_STRING
  65. CHECK_SPECIAL_KEY
  66.                MOVE.B   SCAN_CODE,D0
  67.                CMP.B    #$3B,D0
  68.                BEQ      SECTOR_GET
  69.                CMP.B    #$55,D0
  70.                BEQ      SECTOR_PUT
  71.                CMP.B    #$3D,D0
  72.                BEQ      SECTOR_PRINT
  73.                CMP.B    #$3E,D0
  74.                BEQ      EDIT_SECTOR_EXIT
  75.                CMP.B    #$3F,D0
  76.                BEQ      FIND_STRING
  77.                CMP.B    #$40,D0
  78.                BEQ      FIND_NEXT
  79.                CMP.B    #$41,D0
  80.                BEQ      NEXT_DRIVE
  81.                CMP.B    #$42,D0
  82.                BEQ      NEXT_PAGE
  83.                CMP.B    #$43,D0
  84.                BEQ      NEXT_SECTOR
  85.                CMP.B    #$44,D0
  86.                BEQ      NEXT_TRACK
  87.                CMP.B    #$5C,D0
  88.                BEQ      PREV_SECTOR
  89.                CMP.B    #$5D,D0
  90.                BEQ      PREV_TRACK
  91.                CMP.B    #$48,D0
  92.                BEQ      MOVE_CURSOR_UP
  93.                CMP.B    #$50,D0
  94.                BEQ      MOVE_CURSOR_DOWN
  95.                CMP.B    #$4B,D0
  96.                BEQ      MOVE_CURSOR_LEFT
  97.                CMP.B    #$4D,D0
  98.                BEQ      MOVE_CURSOR_RIGHT
  99.                CMP.B    #$1C,D0
  100.                BEQ      MOVE_CURSOR_RETURN
  101.                MOVE.B   CHAR_CODE,D0
  102. CHECK_NORMAL_KEY
  103.                CMP.B    #'0',D0
  104.                BLT      RING_BELL
  105.                CMP.B    #$3A,D0
  106.                BLT      CHECK_NORMAL_1
  107.                CMP.B    #'A',D0
  108.                BLT      RING_BELL
  109.                CMP.B    #'F',D0
  110.                BGT      RING_BELL
  111.                SUB.B    #7,D0
  112. CHECK_NORMAL_1 SUB.B    #$30,D0
  113.                LEA      BUFFER,A1
  114.                ADD.W    BUFFER_OFFSET,A1
  115.                MOVE.B   (A1),D1
  116.                CMP.B    #0,LEFT_RIGHT_FLAG
  117.                BNE      CHECK_NORMAL_2
  118.                AND.B    #$0F,D1
  119.                ASL      #4,D0
  120.                AND.B    #$F0,D0
  121.                BRA      CHECK_NORMAL_3
  122. CHECK_NORMAL_2 AND.B    #$F0,D1
  123.                AND.B    #$0F,D0
  124. CHECK_NORMAL_3 OR.B     D0,D1
  125.                MOVE.B   D1,(A1)
  126.                MOVE.B   CHAR_CODE,D0
  127.                BSR      WRITE_CHARACTER
  128.                MOVE.B   ASCII_ROW,CURSOR_SET_ROW
  129.                MOVE.B   ASCII_COL,CURSOR_SET_COL
  130.                LEA      CURSOR_SET,A0
  131.                BSR      WRITE_STRING
  132.                MOVE.B   #'.',D0
  133.                CMP.B    #32,D1
  134.                BLT      CHECK_NORMAL_4
  135.                CMP.B    #127,D1
  136.                BGT      CHECK_NORMAL_4
  137.                MOVE.B   D1,D0
  138. CHECK_NORMAL_4 BSR      WRITE_CHARACTER
  139.                BRA      MOVE_CURSOR_RIGHT
  140. RING_BELL      LEA      MSG_INVALID_CHAR,A0
  141.                BSR      WRITE_STRING
  142.                MOVE.B   #1,MSG_ERROR_FLAG
  143.                RTS
  144. BIN_TO_HEX_DIGIT
  145.                AND.B    #$0F,D0
  146.                CMP.B    #10,D0
  147.                BLT      BIN_TO_HEX_DIGIT1
  148.                ADD.B    #7,D0
  149. BIN_TO_HEX_DIGIT1
  150.                ADD.B    #48,D0
  151.                RTS
  152. TURN_CURSOR_ON MOVE.W   #20,-(SP)
  153.                MOVE.W   #1,-(SP)
  154.                MOVE.W   #CURSCONF,-(SP)
  155.                TRAP     #XBIOS
  156.                ADDQ.L   #6,SP
  157.                RTS
  158. TURN_CURSOR_OFF
  159.                MOVE.W   #20,-(SP)
  160.                MOVE.W   #0,-(SP)
  161.                MOVE.W   #CURSCONF,-(SP)
  162.                TRAP     #XBIOS
  163.                ADDQ.L   #6,SP
  164.                RTS
  165. TURN_CAPS_ON   MOVE.W   #16,-(SP)
  166.                MOVE.W   #KBSHIFT,-(SP)
  167.                TRAP     #BIOS
  168.                ADDQ.L   #4,SP
  169.                RTS
  170. PRINT_OFFSET   MOVEM.L  D1-D3,-(SP)
  171.                MOVE.B   #36,CURSOR_SET_ROW
  172.                MOVE.B   #32,CURSOR_SET_COL
  173.                LEA      CURSOR_SET,A0
  174.                BSR      WRITE_STRING
  175.                MOVE.W   PAGE_OFFSET,D2
  176.                MOVE.W   #15,D3
  177. PRINT_OFFSET1  MOVE.W   D2,D0
  178.                MOVE.W   #3,D1
  179.                LEA      SECTOR_PAGE_OFFSET,A0
  180.                BSR      BIN_TO_HEX
  181.                LEA      SECTOR_PAGE,A0
  182.                BSR      WRITE_STRING
  183.                ADD.W    #$10,D2
  184.                DBRA     D3,PRINT_OFFSET1
  185.                MOVEM.L  (SP)+,D1-D3
  186.                RTS
  187. MOVE_CURSOR_RIGHT
  188.                CMP.B    #0,LEFT_RIGHT_FLAG
  189.                BNE      MOVE_RIGHT_1
  190.                MOVE.B   #1,LEFT_RIGHT_FLAG
  191.                BRA      MOVE_RIGHT_2
  192. MOVE_RIGHT_1   MOVE.B   #0,LEFT_RIGHT_FLAG
  193.                ADD.W    #1,COL
  194.                CMP.W    #16,COL
  195.                BLT      MOVE_RIGHT_2
  196.                MOVE.W   #0,COL
  197.                BRA      MOVE_CURSOR_DOWN
  198. MOVE_RIGHT_2   RTS
  199. MOVE_CURSOR_LEFT
  200.                CMP.B    #0,LEFT_RIGHT_FLAG
  201.                BEQ      MOVE_LEFT_1
  202.                MOVE.B   #0,LEFT_RIGHT_FLAG
  203.                BRA      MOVE_LEFT_2
  204. MOVE_LEFT_1    MOVE.B   #1,LEFT_RIGHT_FLAG
  205.                SUB.W    #1,COL
  206.                BPL      MOVE_LEFT_2
  207.                MOVE.W   #15,COL
  208.                BRA      MOVE_CURSOR_UP
  209. MOVE_LEFT_2    RTS
  210. MOVE_CURSOR_DOWN
  211.                ADD.W    #1,ROW
  212.                CMP.W    #16,ROW
  213.                BLT      MOVE_DOWN_1
  214.                MOVE.W   #0,ROW
  215. MOVE_DOWN_1    RTS
  216. MOVE_CURSOR_UP SUB.W    #1,ROW
  217.                BPL      MOVE_UP_1
  218.                MOVE.W   #15,ROW
  219. MOVE_UP_1      RTS
  220. MOVE_CURSOR_RETURN
  221.                MOVE.W   #0,COL
  222.                MOVE.B   #0,LEFT_RIGHT_FLAG
  223.                BRA      MOVE_CURSOR_DOWN
  224. MOVE_CURSOR_HOME
  225.                MOVE.W   #0,COL
  226.                MOVE.W   #0,ROW
  227.                MOVE.B   #0,LEFT_RIGHT_FLAG
  228.                RTS
  229. CALC_BUFFER_LOCATION
  230.                MOVEM.L  D0,-(SP)
  231.                CLR.L    D0
  232.                MOVE.W   ROW,D0
  233.                MULU     #16,D0
  234.                ADD.W    COL,D0
  235.                ADD.W    PAGE_OFFSET,D0
  236.                MOVE.W   D0,BUFFER_OFFSET
  237.                MOVEM.L  (SP)+,D0
  238.                RTS
  239. CALC_HEX_LOCATION
  240.                MOVEM.L  D0,-(SP)
  241.                MOVE.W   ROW,D0
  242.                ADD.W    #36,D0
  243.                MOVE.B   D0,HEX_ROW
  244.                CLR.L    D0
  245.                MOVE.W   COL,D0
  246.                MULU     #3,D0
  247.                ADD.W    #42,D0
  248.                ADD.B    LEFT_RIGHT_FLAG,D0
  249.                MOVE.B   D0,HEX_COL
  250.                MOVEM.L  (SP)+,D0
  251.                RTS
  252. CALC_ASCII_LOCATION
  253.                MOVEM.L  D0,-(SP)
  254.                MOVE.W   ROW,D0
  255.                ADD.W    #36,D0
  256.                MOVE.B   D0,ASCII_ROW
  257.                MOVE.W   COL,D0
  258.                ADD.W    #93,D0
  259.                MOVE.B   D0,ASCII_COL
  260.                MOVEM.L  (SP)+,D0
  261.                RTS
  262. SECTOR_GET     LEA      MSG_LOAD_SECTOR,A0
  263.                BSR      WRITE_STRING
  264.                MOVE.W   #0,SIDE
  265.                MOVE.W   SECTOR,TEMP_SECTOR
  266.                CMP.W    #10,SECTOR
  267.                BLT      SECTOR_GET_1
  268.                MOVE.W   #1,SIDE
  269.                SUB.W    #9,TEMP_SECTOR
  270. SECTOR_GET_1   MOVE.W   #1,-(SP)
  271.                MOVE.W   SIDE,-(SP)
  272.                MOVE.W   TRACK,-(SP)
  273.                MOVE.W   TEMP_SECTOR,-(SP)
  274.                MOVE.W   DRIVE,-(SP)
  275.                MOVE.L   #0,-(SP)
  276.                MOVE.L   #BUFFER,-(SP)
  277.                MOVE.W   #FLOPRD,-(SP)
  278.                TRAP     #XBIOS
  279.                ADD.L    #20,SP
  280.                TST.W    D0
  281.                BMI      SECTOR_DISK_ERROR
  282.                MOVE.W   #0,PAGE_OFFSET
  283.                BSR      PRINT_OFFSET
  284.                BSR      BUILD_DATA_SCREEN
  285.                BSR      MOVE_CURSOR_HOME
  286.                MOVE.B   #0,MSG_ERROR_FLAG
  287.                LEA      MSG_STATUS_OK,A0
  288.                BSR      WRITE_STRING
  289.                RTS
  290. SECTOR_PUT     LEA      MSG_SAVE_SECTOR,A0
  291.                BSR      WRITE_STRING
  292.                MOVE.W   #0,SIDE
  293.                MOVE.W   SECTOR,TEMP_SECTOR
  294.                CMP.W    #10,SECTOR
  295.                BLT      SECTOR_PUT_1
  296.                MOVE.W   #1,SIDE
  297.                SUB.W    #9,TEMP_SECTOR
  298. SECTOR_PUT_1   MOVE.W   #1,-(SP)
  299.                MOVE.W   SIDE,-(SP)
  300.                MOVE.W   TRACK,-(SP)
  301.                MOVE.W   TEMP_SECTOR,-(SP)
  302.                MOVE.W   DRIVE,-(SP)
  303.                MOVE.L   #0,-(SP)
  304.                MOVE.L   #BUFFER,-(SP)
  305.                MOVE.W   #FLOPWR,-(SP)
  306.                TRAP     #XBIOS
  307.                ADD.L    #20,SP
  308.                TST.W    D0
  309.                BMI      SECTOR_DISK_ERROR
  310.                MOVE.W   #0,PAGE_OFFSET
  311.                BSR      PRINT_OFFSET
  312.                BSR      BUILD_DATA_SCREEN
  313.                BSR      MOVE_CURSOR_HOME
  314.                MOVE.B   #0,MSG_ERROR_FLAG
  315.                LEA      MSG_STATUS_OK,A0
  316.                BSR      WRITE_STRING
  317.                RTS
  318. SECTOR_DISK_ERROR
  319.                NEG.W    D0
  320.                AND.W    #$1F,D0
  321.                MOVE.W   #2,D1
  322.                LEA      MSG_DISK_ERROR_NO,A0
  323.                BSR      BIN_TO_DEC
  324.                LEA      MSG_DISK_ERROR,A0
  325.                BSR      WRITE_STRING
  326.                MOVE.B   #1,MSG_ERROR_FLAG
  327.                RTS
  328. SECTOR_PRINT   LEA      MSG_PRINT,A0
  329.                BSR      WRITE_STRING
  330.                MOVE.B   DISPLAY_DRIVE_NO,HC_DRIVE
  331.                LEA      DISPLAY_SECTOR_NO,A0
  332.                LEA      HC_SECTOR,A1
  333.                MOVE.B   (A0)+,(A1)+
  334.                MOVE.B   (A0)+,(A1)+
  335.                LEA      DISPLAY_TRACK_NO,A0
  336.                LEA      HC_TRACK,A1
  337.                MOVE.B   (A0)+,(A1)+
  338.                MOVE.B   (A0)+,(A1)+
  339.                LEA      HC_TITLE,A1
  340.                BSR      WRITE_HC_STRING
  341.                TST.W    D0
  342.                BMI      SECTOR_PRINT_6
  343.                CLR.W    D2
  344.                LEA      BUFFER,A2
  345.                MOVE.W   #31,D4
  346. SECTOR_PRINT_1 MOVE.W   D2,D0
  347.                MOVE.W   #3,D1
  348.                LEA      HC_OFFSET,A0
  349.                BSR      BIN_TO_HEX
  350.                LEA      HC_HEX,A0
  351.                LEA      HC_ASCII,A1
  352.                MOVE.W   #15,D3
  353. SECTOR_PRINT_2 MOVE.B   (A2),D0
  354.                CMP.B    #$20,D0
  355.                BLT      SECTOR_PRINT_3
  356.                CMP.B    #$7F,D0
  357.                BGT      SECTOR_PRINT_3
  358.                BRA      SECTOR_PRINT_4
  359. SECTOR_PRINT_3 MOVE.B   #'.',D0
  360. SECTOR_PRINT_4 MOVE.B   D0,(A1)+
  361.                MOVE.B   (A2)+,D0
  362.                MOVE.B   D0,D1
  363.                AND.B    #$F0,D0
  364.                LSR.B    #4,D0
  365.                BSR      BIN_TO_HEX_DIGIT
  366.                MOVE.B   D0,(A0)+
  367.                MOVE.B   D1,D0
  368.                BSR      BIN_TO_HEX_DIGIT
  369.                MOVE.B   D0,(A0)+
  370.                MOVE.B   #' ',(A0)+
  371.                DBRA     D3,SECTOR_PRINT_2
  372.                LEA      HC_DATA_LINE,A1
  373.                BSR      WRITE_HC_STRING
  374.                TST.W    D0
  375.                BMI      SECTOR_PRINT_6
  376.                ADD.W    #16,D2
  377.                CMP.W    #16,D4
  378.                BNE      SECTOR_PRINT_5
  379.                LEA      HC_CR,A1
  380.                BSR      WRITE_HC_STRING
  381. SECTOR_PRINT_5 DBRA     D4,SECTOR_PRINT_1
  382.                LEA      HC_FF,A1
  383.                BSR      WRITE_HC_STRING
  384.                LEA      MSG_STATUS_OK,A0
  385.                BSR      WRITE_STRING
  386.                MOVE.B   #0,MSG_ERROR_FLAG
  387.                BRA      SECTOR_PRINT_7
  388. SECTOR_PRINT_6 LEA      MSG_PRINT_ERROR,A0
  389.                BSR      WRITE_STRING
  390.                MOVE.B   #1,MSG_ERROR_FLAG
  391. SECTOR_PRINT_7 RTS
  392. WRITE_HC_STRING
  393.                CLR.W    D0
  394.                MOVE.B   (A1)+,D0
  395.                TST.W    D0
  396.                BEQ      WRITE_HC_STRING_1
  397.                MOVE.W   D0,-(SP)
  398.                MOVE.W   #PRINTEROUT,-(SP)
  399.                TRAP     #GEMDOS
  400.                ADDQ.L   #4,SP
  401.                TST.W    D0
  402.                BMI      WRITE_HC_STRING
  403.                MOVE.W   #-1,D0
  404. WRITE_HC_STRING_1
  405.                RTS
  406. SECTOR_SEARCH  MOVE.W   BUFFER_OFFSET,D4
  407.                CLR.W    D3
  408.                MOVE.B   SEARCH_KEY_LEN,D3
  409.                SUB.W    #1,D3
  410.                LEA      MSG_SEARCHING,A0
  411.                BSR      WRITE_STRING
  412. SECTOR_SEARCH_1
  413.                MOVE.W   #0,SIDE
  414.                MOVE.W   SECTOR,TEMP_SECTOR
  415.                CMP.W    #10,SECTOR
  416.                BLT      SECTOR_SEARCH_1A
  417.                MOVE.W   #1,SIDE
  418.                SUB.W    #9,TEMP_SECTOR
  419. SECTOR_SEARCH_1A
  420.                MOVE.W   #1,-(SP)
  421.                MOVE.W   SIDE,-(SP)
  422.                MOVE.W   TRACK,-(SP)
  423.                MOVE.W   TEMP_SECTOR,-(SP)
  424.                MOVE.W   DRIVE,-(SP)
  425.                MOVE.L   #0,-(SP)
  426.                MOVE.L   #BUFFER,-(SP)
  427.                MOVE.W   #FLOPRD,-(SP)
  428.                TRAP     #XBIOS
  429.                ADD.L    #20,SP
  430.                TST.W    D0
  431.                BMI      SECTOR_DISK_ERROR
  432. SECTOR_SEARCH_2
  433.                MOVE.W   D4,D0
  434.                ADD.W    D3,D0
  435.                CMP.W    #510,D0
  436.                BGT      SECTOR_SEARCH_5
  437.                LEA      BUFFER,A0
  438.                ADD.W    D4,A0
  439.                LEA      SEARCH_KEY,A1
  440.                MOVE.W   D3,D0
  441. SECTOR_SEARCH_3
  442.                CMP.B    (A0)+,(A1)+
  443.                BNE      SECTOR_SEARCH_4
  444.                DBRA     D0,SECTOR_SEARCH_3
  445.                MOVE.W   D4,D0
  446.                AND.W    #$0100,D0
  447.                MOVE.W   D0,PAGE_OFFSET
  448.                MOVE.W   D4,D0
  449.                LSR.B    #4,D0
  450.                AND.W    #$0F,D0
  451.                MOVE.W   D0,ROW
  452.                MOVE.W   D4,D0
  453.                AND.W    #$0F,D0
  454.                MOVE.W   D0,COL
  455.                MOVE.B   #0,LEFT_RIGHT_FLAG
  456.                BSR      PRINT_OFFSET
  457.                BSR      BUILD_DATA_SCREEN
  458.                MOVE.B   #1,MSG_ERROR_FLAG
  459.                LEA      MSG_FOUND,A0
  460.                BSR      WRITE_STRING
  461.                BRA      SECTOR_SEARCH_9
  462. SECTOR_SEARCH_4
  463.                ADDQ.W   #1,D4
  464.                BRA      SECTOR_SEARCH_2
  465. SECTOR_SEARCH_5
  466.                MOVE.W   #0,D4
  467.                MOVE.W   #CONSTAT,-(SP)
  468.                TRAP     #GEMDOS
  469.                ADD.L    #2,SP
  470.                TST.W    D0
  471.                BEQ      SECTOR_SEARCH_6
  472.                BSR      RESTORE_KEYS
  473.                BSR      PRINT_TRACK
  474.                BSR      PRINT_SECTOR
  475.                LEA      MSG_FIND_ABORT,A0
  476.                BSR      WRITE_STRING
  477.                MOVE.B   #1,MSG_ERROR_FLAG
  478.                BRA      SECTOR_SEARCH_9
  479. SECTOR_SEARCH_6
  480.                ADDQ.W   #1,SECTOR
  481.                MOVE.W   SECTOR,D0
  482.                CMP.W    SECTOR_LIMIT,D0
  483.                BGT      SECTOR_SEARCH_7
  484.                BSR      PRINT_SECTOR
  485.                BRA      SECTOR_SEARCH_1
  486. SECTOR_SEARCH_7
  487.                MOVE.W   #1,SECTOR
  488.                BSR      PRINT_SECTOR
  489.                ADDQ.W   #1,TRACK
  490.                CMP.W    #80,TRACK
  491.                BEQ      SECTOR_SEARCH_8
  492.                BSR      PRINT_TRACK
  493.                BRA      SECTOR_SEARCH_1
  494. SECTOR_SEARCH_8
  495.                BSR      RESTORE_KEYS
  496.                BSR      PRINT_TRACK
  497.                BSR      PRINT_SECTOR
  498.                LEA      MSG_NOT_FOUND,A0
  499.                BSR      WRITE_STRING
  500.                MOVE.B   #1,MSG_ERROR_FLAG
  501. SECTOR_SEARCH_9 RTS
  502. FIND_STRING    LEA      MSG_FIND,A0
  503.                BSR      WRITE_STRING
  504.                BSR      TURN_CURSOR_ON
  505.                MOVE.B   #70,KB_BUFFER
  506.                LEA      KB_BUFFER,A0
  507.                BSR      READ_STRING
  508.                AND.W    #$FF,D0
  509.                MOVE.B   D0,SEARCH_KEY_LEN
  510.                TST.W    D0
  511.                BEQ      FIND_STRING_ABORTED
  512.                SUB.W    #1,D0
  513.                LEA      KB_BUFFER_DATA,A0
  514.                LEA      SEARCH_KEY,A1
  515.                CMP.B    #'X',(A0)
  516.                BNE      FIND_STRING_2
  517.                TST.W    D0
  518.                BEQ      FIND_STRING_1
  519.                MOVE.W   D0,D1
  520.                AND.W    #1,D1
  521.                CMP.W    #1,D1
  522.                BEQ      FIND_STRING_1
  523.                BSR      CONVERT_TO_HEX
  524.                TST.W    D0
  525.                BEQ      FIND_STRING_3
  526. FIND_STRING_1  MOVE.B   #0,SEARCH_KEY_LEN
  527.                LEA      MSG_INVALID_HEX,A0
  528.                BSR      WRITE_STRING
  529.                MOVE.B   #1,MSG_ERROR_FLAG
  530.                BRA      FIND_STRING_4
  531. FIND_STRING_2  MOVE.B   (A0)+,(A1)+
  532.                DBRA     D0,FIND_STRING_2
  533. FIND_STRING_3  BSR      SAVE_KEYS
  534.                BSR      TURN_CURSOR_OFF
  535.                BRA      SECTOR_SEARCH
  536. FIND_STRING_4  RTS
  537. FIND_STRING_ABORTED
  538.                LEA      MSG_FIND_ABORT,A0
  539.                BSR      WRITE_STRING
  540.                MOVE.B   #1,MSG_ERROR_FLAG
  541.                RTS
  542. FIND_NEXT      CMP.B    #0,SEARCH_KEY_LEN
  543.                BEQ      FIND_STRING_ABORTED
  544.                BSR      SAVE_KEYS
  545.                ADD.W    #1,BUFFER_OFFSET
  546.                CMP.W    #512,BUFFER_OFFSET
  547.                BNE      SECTOR_SEARCH
  548.                MOVE.W   #0,BUFFER_OFFSET
  549.                ADD.W    #1,SECTOR
  550.                MOVE.W   SECTOR,D0
  551.                CMP.W    SECTOR_LIMIT,D0
  552.                BGT      FIND_NEXT_1
  553.                BSR      PRINT_SECTOR
  554.                BRA      SECTOR_SEARCH
  555. FIND_NEXT_1    MOVE.W   #1,SECTOR
  556.                BSR      PRINT_SECTOR
  557.                ADD.W    #1,TRACK
  558.                CMP.W    #80,TRACK
  559.                BEQ      FIND_NEXT_2
  560.                BSR      PRINT_TRACK
  561.                BRA      SECTOR_SEARCH
  562. FIND_NEXT_2    MOVE.W   #0,TRACK
  563.                BSR      PRINT_TRACK
  564.                BRA      SECTOR_SEARCH
  565. CONVERT_TO_HEX MOVE.W   D0,D2
  566.                SUB.W    #1,D2
  567.                MOVE.B   #0,SEARCH_KEY_LEN
  568.                MOVE.B   (A0)+,D0
  569. CONVERT_TO_HEX_1
  570.                MOVE.B   (A0)+,D0
  571.                BSR      HEX_TO_BIN
  572.                TST.W    D0
  573.                BMI      CONVERT_TO_HEX_2
  574.                MOVE.B   D0,D1
  575.                ASL.B    #4,D1
  576.                MOVE.B   (A0)+,D0
  577.                BSR      HEX_TO_BIN
  578.                TST.W    D0
  579.                BMI      CONVERT_TO_HEX_2
  580.                ADD.B    D0,D1
  581.                MOVE.B   D1,(A1)+
  582.                ADD.B    #1,SEARCH_KEY_LEN
  583.                SUB.W    #1,D2
  584.                DBRA     D2,CONVERT_TO_HEX_1
  585.                CLR.W    D0
  586. CONVERT_TO_HEX_2
  587.                RTS
  588. HEX_TO_BIN     CMP.B    #'0',D0
  589.                BLT      HEX_TO_BIN_3
  590.                CMP.B    #'9',D0
  591.                BGT      HEX_TO_BIN_1
  592.                BRA      HEX_TO_BIN_2
  593. HEX_TO_BIN_1   CMP.B    #'A',D0
  594.                BLT      HEX_TO_BIN_3
  595.                CMP.B    #'F',D0
  596.                BGT      HEX_TO_BIN_3
  597.                SUB.B    #$37,D0
  598. HEX_TO_BIN_2   AND.B    #$0F,D0
  599.                BRA      HEX_TO_BIN_4
  600. HEX_TO_BIN_3   MOVE.W   #-1,D0
  601. HEX_TO_BIN_4   RTS
  602.                
  603. SAVE_KEYS      MOVE.W   PAGE_OFFSET,PAGE_OFFSET_SAVE
  604.                MOVE.W   ROW,ROW_SAVE
  605.                MOVE.W   COL,COL_SAVE
  606.                MOVE.W   TRACK,TRACK_SAVE
  607.                MOVE.W   SECTOR,SECTOR_SAVE
  608.                RTS
  609. RESTORE_KEYS   MOVE.W   PAGE_OFFSET_SAVE,PAGE_OFFSET
  610.                MOVE.W   ROW_SAVE,ROW
  611.                MOVE.W   COL_SAVE,COL
  612.                MOVE.W   TRACK_SAVE,TRACK
  613.                MOVE.W   SECTOR_SAVE,SECTOR
  614.                RTS
  615. GET_BOOT_SECTOR
  616.                LEA      MSG_DRIVE,A0
  617.                BSR      WRITE_STRING
  618.                MOVE.W   #0,TRACK
  619.                MOVE.W   #1,SECTOR
  620.                BSR      PRINT_TRACK
  621.                BSR      PRINT_SECTOR
  622.                MOVE.W   #9,SECTOR_LIMIT
  623.                MOVE.W   #1,-(SP)
  624.                MOVE.W   #0,-(SP)
  625.                MOVE.W   #0,-(SP)
  626.                MOVE.W   #1,-(SP)
  627.                MOVE.W   DRIVE,-(SP)
  628.                MOVE.L   #0,-(SP)
  629.                MOVE.L   #BOOT_BUFFER,-(SP)
  630.                MOVE.W   #FLOPRD,-(SP)
  631.                TRAP     #XBIOS
  632.                ADD.L    #20,SP
  633.                TST.W    D0
  634.                BMI      GET_BOOT_SECTOR_1
  635.                LEA      BOOT_BUFFER,A0
  636.                CMP.B    #1,26(A0)
  637.                BEQ      GET_BOOT_SECTOR_2
  638.                MOVE.W   #18,SECTOR_LIMIT
  639.                BRA      GET_BOOT_SECTOR_2
  640. GET_BOOT_SECTOR_1
  641.                BSR      SECTOR_DISK_ERROR
  642.                BRA      GET_BOOT_SECTOR_3
  643. GET_BOOT_SECTOR_2
  644.                LEA      MSG_STATUS_OK,A0
  645.                BSR      WRITE_STRING
  646.                MOVE.B   #0,MSG_ERROR_FLAG
  647. GET_BOOT_SECTOR_3
  648.                RTS
  649. NEXT_PAGE      CMP.W    #0,PAGE_OFFSET
  650.                BEQ      NEXT_PAGE_1
  651.                MOVE.W   #0,PAGE_OFFSET
  652.                BRA      NEXT_PAGE_2
  653. NEXT_PAGE_1    MOVE.W   #256,PAGE_OFFSET
  654. NEXT_PAGE_2    BSR      PRINT_OFFSET
  655.                BSR      BUILD_DATA_SCREEN
  656.                BSR      MOVE_CURSOR_HOME
  657.                RTS
  658. NEXT_DRIVE     ADD.W    #1,DRIVE
  659.                CMP.W    #2,DRIVE
  660.                BNE      NEXT_DRIVE_1
  661.                MOVE.W   #0,DRIVE
  662. NEXT_DRIVE_1   BSR      PRINT_DRIVE
  663.                BSR      GET_BOOT_SECTOR
  664.                RTS
  665. NEXT_SECTOR    ADD.W    #1,SECTOR
  666.                MOVE.W   SECTOR,D0
  667.                CMP.W    SECTOR_LIMIT,D0
  668.                BGT      NEXT_SECTOR_1
  669.                BRA      NEXT_SECTOR_2
  670. NEXT_SECTOR_1  MOVE.W   #1,SECTOR
  671. NEXT_SECTOR_2  BSR      PRINT_SECTOR
  672.                RTS
  673. PREV_SECTOR    SUB.W    #1,SECTOR
  674.                CMP.W    #0,SECTOR
  675.                BNE      PREV_SECTOR_1
  676.                MOVE.W   #9,SECTOR
  677. PREV_SECTOR_1  BSR      PRINT_SECTOR
  678.                RTS
  679. NEXT_TRACK     ADD.W    #1,TRACK
  680.                CMP.W    #80,TRACK
  681.                BLT      NEXT_TRACK_1
  682.                MOVE.W   #0,TRACK
  683. NEXT_TRACK_1   BSR      PRINT_TRACK
  684.                RTS
  685. PREV_TRACK     SUB.W    #1,TRACK
  686.                BPL      PREV_TRACK_1
  687.                MOVE.W   #79,TRACK
  688. PREV_TRACK_1   BSR      PRINT_TRACK
  689.                RTS
  690. PRINT_TRACK    MOVEM.L  D1,-(SP)
  691.                MOVE.W   TRACK,D0
  692.                MOVE.W   #2,D1
  693.                LEA      DISPLAY_TRACK_NO,A0
  694.                BSR      BIN_TO_DEC
  695.                LEA      DISPLAY_TRACK,A0
  696.                BSR      WRITE_STRING
  697.                MOVEM.L  (SP)+,D1
  698.                RTS
  699. PRINT_SECTOR   MOVEM.L  D1,-(SP)
  700.                MOVE.W   SECTOR,D0
  701.                MOVE.W   #2,D1
  702.                LEA      DISPLAY_SECTOR_NO,A0
  703.                BSR      BIN_TO_DEC
  704.                LEA      DISPLAY_SECTOR,A0
  705.                BSR      WRITE_STRING
  706.                MOVEM.L  (SP)+,D1
  707.                RTS
  708. PRINT_DRIVE    MOVE.W   DRIVE,D0
  709.                ADD.W    #'A',D0
  710.                MOVE.B   D0,DISPLAY_DRIVE_NO
  711.                LEA      DISPLAY_DRIVE,A0
  712.                BSR      WRITE_STRING
  713.                RTS
  714. ZERO_BUFFER    MOVE.L   #127,D0
  715.                LEA      BUFFER,A0
  716. ZERO_BUFFER_LOOP
  717.                MOVE.L   #0,(A0)+
  718.                DBRA     D0,ZERO_BUFFER_LOOP
  719.                RTS
  720. BUILD_DATA_SCREEN
  721.                MOVEM.L  D1-D3/A1-A3,-(SP)
  722.                MOVE.W   #15,D2
  723.                LEA      BUFFER,A1
  724.                ADD.W    PAGE_OFFSET,A1
  725.                MOVE.B   #36,DATA_LINE_ROW
  726.                MOVE.B   #42,DATA_LINE_COL
  727. BUILD_DS_1     MOVE.W   #15,D3
  728.                LEA      DATA_LINE_HEX,A2
  729.                LEA      DATA_LINE_ASCII,A3
  730. BUILD_DS_2     MOVE.B   (A1),D0
  731.                CMP.B    #$20,D0
  732.                BLT      BUILD_DS_3
  733.                CMP.B    #$7F,D0
  734.                BGT      BUILD_DS_3
  735.                BRA      BUILD_DS_4
  736. BUILD_DS_3     MOVE.B   #'.',D0
  737. BUILD_DS_4     MOVE.B   D0,(A3)+
  738.                MOVE.B   (A1)+,D0
  739.                MOVE.B   D0,D1
  740.                AND.B    #$F0,D0
  741.                LSR.B    #4,D0
  742.                BSR      BIN_TO_HEX_DIGIT
  743.                MOVE.B   D0,(A2)+
  744.                MOVE.B   D1,D0
  745.                BSR      BIN_TO_HEX_DIGIT
  746.                MOVE.B   D0,(A2)+
  747.                MOVE.B   #' ',(A2)+
  748.                DBRA     D3,BUILD_DS_2
  749.                LEA      DATA_LINE,A0
  750.                BSR      WRITE_STRING
  751.                ADD.B    #1,DATA_LINE_ROW
  752.                DBRA     D2,BUILD_DS_1
  753.                MOVEM.L  (SP)+,D1-D3/A1-A3
  754.                RTS
  755. BIN_TO_HEX     MOVEM.L  D0-D2/A0,-(SP)
  756.                ADD.W    D1,A0
  757.                SUB.W    #1,D1
  758.                MOVE.L   D0,D2
  759. BIN_TO_HEX1    MOVE.B   D2,D0
  760.                BSR      BIN_TO_HEX_DIGIT
  761.                MOVE.B   D0,-(A0)
  762.                LSR.L    #4,D2
  763.                DBRA     D1,BIN_TO_HEX1
  764.                MOVEM.L  (SP)+,D0-D2/A0
  765.                RTS
  766. BIN_TO_DEC     MOVEM.L  D0-D1/A0,-(SP)
  767.                ADD.W    D1,A0
  768.                SUBQ.W   #1,D1
  769. BIN_TO_DEC2    EXT.L    D0
  770.                DIVS     #10,D0
  771.                SWAP     D0
  772.                MOVE.B   D0,-(A0)
  773.                ADD.B    #'0',(A0)
  774.                SWAP     D0
  775.                DBRA     D1,BIN_TO_DEC2
  776.                MOVEM.L  (SP)+,D0-D1/A0
  777.                RTS
  778. WRITE_STRING   MOVE.L   A0,-(SP)
  779.                MOVE.W   #CONWS,-(SP)
  780.                TRAP     #GEMDOS
  781.                ADDQ.L   #6,SP
  782.                RTS
  783. READ_STRING    MOVE.L   A0,-(SP)
  784.                MOVE.W   #CONRS,-(SP)
  785.                TRAP     #GEMDOS
  786.                ADDQ.L   #6,SP
  787.                RTS
  788. WRITE_CHARACTER
  789.                MOVE.W   D0,-(SP)
  790.                MOVE.W   #CONOUT,-(SP)
  791.                TRAP     #GEMDOS
  792.                ADDQ.L   #4,SP
  793.                RTS
  794. READ_CHARACTER MOVE.W   #CONIN,-(SP)
  795.                TRAP     #GEMDOS
  796.                ADDQ.L   #2,SP
  797.                RTS
  798.  
  799.                DATA
  800. SECTOR_SCREEN  DC.B  27,CLEAR_HOME
  801.                DC.B  27,'p'
  802.                DC.B  ' Doctor Flop E. Disk       Sector '
  803.                DC.B  'Editor       '
  804.                DC.B  'Drive A    Track 00    Sector 00 '
  805.                DC.B  27,'q'
  806.                DC.B  27,'Y',34,43
  807.                DC.B  '0  1  2  3  4  5  6  7  '
  808.                DC.B  '8  9  A  B  C  D  E  F    '
  809.                DC.B  '0123456789ABCDEF'
  810.                DC.B  27,'Y',53,40
  811.                DC.B  'F1=Get      F3=Print   F5=Find '
  812.                DC.B  '   F7=Drive   F9 =Sector'
  813.                DC.B  27,'Y',54,40
  814.                DC.B  'F2=Put      F4=Exit    F6=Next '
  815.                DC.B  '   F8=Page    F10=Track'
  816.                DC.B  0
  817. SECTOR_PAGE    DC.B  '    '
  818. SECTOR_PAGE_OFFSET
  819.                DC.B  '000'
  820.                DC.B  CR,LF
  821.                DC.B  0
  822. DATA_LINE      DC.B  27,'Y'
  823. DATA_LINE_ROW  DC.B  36
  824. DATA_LINE_COL  DC.B  42
  825. DATA_LINE_HEX  DC.B  '00 00 00 00 00 00 00 00 '
  826.                DC.B  '00 00 00 00 00 00 00 00   |'
  827. DATA_LINE_ASCII
  828.                DC.B  '................|'
  829.                DC.B  0
  830. CURSOR_SET     DC.B  27,'Y'
  831. CURSOR_SET_ROW DC.B  32
  832. CURSOR_SET_COL DC.B  32
  833.                DC.B  0
  834. MSG_STATUS_OK  DC.B  27,'Y',56,32
  835.                DC.B  '> OK.'
  836.                DC.B  27,'K'
  837.                DC.B  0
  838. MSG_INVALID_CHAR
  839.                DC.B  27,'Y',56,32
  840.                DC.B  '> Invalid character.'
  841.                DC.B  27,'K'
  842.                DC.B  BEL
  843.                DC.B  0
  844. MSG_DISK_ERROR DC.B  27,'Y',56,32
  845.                DC.B  '> Disk error #'
  846. MSG_DISK_ERROR_NO
  847.                DC.B  '00 has occurred.'
  848.                DC.B  27,'K'
  849.                DC.B  0
  850. MSG_PRINT_ERROR
  851.                DC.B  27,'Y',56,32
  852.                DC.B  '> Printer is not responding.'
  853.                DC.B  27,'K'
  854.                DC.B  0
  855. MSG_PRINT      DC.B  27,'Y',56,32
  856.                DC.B  '> Printing.  '
  857.                DC.B  27,'K'
  858.                DC.B  0
  859. MSG_LOAD_SECTOR
  860.                DC.B  27,'Y',56,32
  861.                DC.B  '> Reading sector.  '
  862.                DC.B  27,'K'
  863.                DC.B  0
  864. MSG_SAVE_SECTOR
  865.                DC.B  27,'Y',56,32
  866.                DC.B  '> Writing sector.  '
  867.                DC.B  27,'K'
  868.                DC.B  0
  869. MSG_FIND       DC.B  27,'Y',56,32
  870.                DC.B  '> Find:  '
  871.                DC.B  27,'K'
  872.                DC.B  0
  873. MSG_FIND_ABORT DC.B  27,'Y',56,32
  874.                DC.B  '> Find was aborted.'
  875.                DC.B  27,'K'
  876.                DC.B  0
  877.               
  878. MSG_SEARCHING  DC.B  27,'Y',56,32
  879.                DC.B  '> Searching.  '
  880.                DC.B  27,'K'
  881.                DC.B  0
  882. MSG_FOUND      DC.B  27,'Y',56,32
  883.                DC.B  '> String was found.'
  884.                DC.B  27,'K'
  885.                DC.B  0
  886. MSG_NOT_FOUND  DC.B  27,'Y',56,32
  887.                DC.B  '> End of disk reached.'
  888.                DC.B  27,'K'
  889.                DC.B  0
  890. MSG_INVALID_HEX
  891.                DC.B  27,'Y',56,32
  892.                DC.B  '> Invalid hex string.'
  893.                DC.B  27,'K'
  894.                DC.B  0
  895. MSG_DRIVE      DC.B  27,'Y',56,32
  896.                DC.B  '> Setting drive.'
  897.                DC.B  27,'K'
  898.                DC.B  0
  899. DISPLAY_TRACK  DC.B  27,'Y',32,96
  900.                DC.B  27,'p'
  901. DISPLAY_TRACK_NO
  902.                DC.B  '00'
  903.                DC.B  27,'q'
  904.                DC.B  0
  905. DISPLAY_SECTOR DC.B  27,'Y',32,109
  906.                DC.B  27,'p'
  907. DISPLAY_SECTOR_NO
  908.                DC.B  '01'
  909.                DC.B  27,'q'
  910.                DC.B  0
  911. DISPLAY_DRIVE  DC.B  27,'Y',32,85
  912.                DC.B  27,'p'
  913. DISPLAY_DRIVE_NO
  914.                DC.B  'A'
  915.                DC.B  27,'q'
  916.                DC.B  0
  917. HC_TITLE       DC.B  CR,LF,LF
  918.                DC.B  ' Doctor Flop E. Disk       Sector '
  919.                DC.B  'Editor       '
  920.                DC.B  'Drive '
  921. HC_DRIVE       DC.B  'A'
  922.                DC.B  '    Track '
  923. HC_TRACK       DC.B  '00'
  924.                DC.B  '    Sector '
  925. HC_SECTOR      DC.B  '00'
  926.                DC.B  CR,LF,LF,LF,LF
  927.                DC.B  '           0  1  2  3  4  5  6  7  '
  928.                DC.B  '8  9  A  B  C  D  E  F    '
  929.                DC.B  '0123456789ABCDEF'
  930.                DC.B  CR,LF,LF,LF
  931.                DC.B  0
  932. HC_DATA_LINE   DC.B  '    '
  933. HC_OFFSET      DC.B  '000'
  934.                DC.B  '   '
  935. HC_HEX         DC.B  '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
  936.                DC.B  '   |'
  937. HC_ASCII       DC.B  '................|'
  938.                DC.B  CR,LF
  939.                DC.B  0
  940. HC_CR          DC.B  CR,LF,0
  941. HC_FF          DC.B  12,0
  942. CHAR_CODE      DS.B  1
  943. SCAN_CODE      DS.B  1
  944. LEFT_RIGHT_FLAG
  945.                DS.B  1
  946. MSG_ERROR_FLAG DS.B  1
  947. HEX_ROW        DS.B  1
  948. HEX_COL        DS.B  1
  949. ASCII_ROW      DS.B  1
  950. ASCII_COL      DS.B  1
  951. COL_SAVE       DS.W  1
  952. ROW_SAVE       DS.W  1
  953. TRACK_SAVE     DS.W  1
  954. SECTOR_SAVE    DS.W  1
  955. PAGE_OFFSET_SAVE
  956.                DS.W  1
  957. COL            DS.W  1
  958. ROW            DS.W  1
  959. DRIVE          DS.W  1
  960. SIDE           DS.W  1
  961. TRACK          DS.W  1
  962. SECTOR         DS.W  1
  963. SECTOR_LIMIT   DS.W  1
  964. TEMP_SECTOR    DS.W  1
  965. SEARCH_OFFSET  DS.W  1
  966. TEMP_OFFSET    DS.W  1
  967. PAGE_OFFSET    DS.W  1
  968. BUFFER_OFFSET  DS.W  1
  969. KB_BUFFER      DS.B  1
  970. KB_BUFFER_LEN  DS.B  1
  971. KB_BUFFER_DATA DS.B  80
  972. SEARCH_KEY_LEN DS.B  1
  973. SEARCH_KEY     DS.B  80
  974. BOOT_BUFFER    DS.W  512
  975. BUFFER         DS.W  512
  976.                END
  977.  
  978.